package com.acmen.easyapi.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;


/***
 * 加密解密工具类
 * add 2013-04-18
 * @Author acmen
 *
 */

public class Md5Util {

    /**
     * 1.一个运用基本类的实例
     * MessageDigest 对象开始被初始化。该对象通过使用 update 方法处理数据。
     * 任何时候都可以调用 reset 方法重置摘要。
     * 一旦所有需要更新的数据都已经被更新了，应该调用 digest 方法之一完成哈希计算。
     * 对于给定数量的更新数据，digest 方法只能被调用一次。
     * 在调用 digest 之后，MessageDigest 对象被重新设置成其初始状态。
     * 一次md5加密，不可逆转
     *
     * @param str
     * @return
     */
    public static String md5(String str) {
        if (str == null) {
            str = "";
        }
        String sztem, output = "";
        byte[] btem;
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.reset();
            md.update(str.getBytes());
            btem = md.digest();
            for (int i = 0; i < btem.length; i++) {
                sztem = Integer.toString(0xff & btem[i], 16);
                if (sztem.length() == 1){
                    sztem = "0" + sztem;
                }
                output += sztem.toUpperCase();
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return output;
    }

    public static String md5(byte[] bytes) {
        String sztem, output = "";
        byte[] btem;
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.reset();
            md.update(bytes);
            btem = md.digest();
            for (int i = 0; i < btem.length; i++) {
                sztem = Integer.toString(0xff & btem[i], 16);
                if (sztem.length() == 1){
                    sztem = "0" + sztem;
                }
                output += sztem.toUpperCase();
            }
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return output;
    }

    /**
     * 双重md5加密，不可逆转
     *
     * @param str
     * @return
     */
    public static String md5for2(String str) {
        return md5(md5(str));
    }
}
